/*
 * Università degli Studi di Trento
 * Facoltà di Scienze MM.FF.NN.
 * Corso di Laurea Triennale in Informatica
 * A.A. 2011/2012
 * Progetto per il corso di Sistemi Operativi 1
 * Progetto 3: 
 * Autori:
 * Bertoldi Lorenzo 155863
 * Cattin Cosso Manuel 146607
 * Parrello Nicola 145610
 */

/********************************************************************************
  Questo file contiene la definizione della struttura dei thread figli
  e i metodi ad essi collegati.
********************************************************************************/


#ifndef THREADFIGLIO_H
#define THREADFIGLIO_H

#include "definizioni.h"


typedef enum SState {
	SLEEP = 0, RUN=1, FINISH=2
}State ;

typedef struct SThreadFiglio{
    int pid;
    char * command;
    State state;
    int pipe[2];
    boolean pipeApertaRead;
    boolean pipeApertaWrite;
    int file;
    boolean fileAperto;
  }ThreadFiglio;
  
typedef struct SThreadFiglio * pThreadFiglio;


/*
 * costruttore :
 * Alloca lo spazio per la struttura ThreadFiglio e istanzia le variabili
 * Di default il figlio e' addormentato
 * Restituisce il puntatore.
*/
pThreadFiglio ThreadFiglio_create (char *);

/*
 * setPid :
 * imposta il pid del figlio
*/
void ThreadFiglio_setPid (pThreadFiglio, int);


/*
 * start :
 * se il figlio dormiva viene avviato
 * Ritorna lo stato del figlio
*/
State ThreadFiglio_start(pThreadFiglio);

/*
 * closePipeWrite :
 * Chiude la pipe in scrittura
 * Restituisce -1 in caso di insuccesso e 0 altrimenti
*/
int ThreadFiglio_closePipeWrite (pThreadFiglio);
  
/*
 * terminate :
 * il figlio viene terminato
 * Ritorna lo stato del figlio
*/
State ThreadFiglio_terminate(pThreadFiglio);    

/*
 * finish :
 * mette lo stato finish al thread e chiude la pipe in scrittura
 * Ritorna lo stato del figlio
*/
State ThreadFiglio_setFinish(pThreadFiglio);    

/*
 * getState :
 * return: lo stato attuale del thread
*/
State ThreadFiglio_getState(pThreadFiglio);

/*
 * distruttore:
 * Invia il segnale di terminazione al thread, rilascia le risorse occupate
 * return: un intero, se 0  distruzione avvenuta
                      se >0 distruzione non avvenuta
*/
int ThreadFiglio_destroy(pThreadFiglio);


#endif /* THREADFIGLIO_H */
